﻿#pragma once
#include <QObject>
#include <QMap>
#include "netDataManager.h"

class QTcpSocket;
class QTcpServer;

class NetClient : public QObject {
	Q_OBJECT

public:
	NetClient(QObject * parent = NULL);
	~NetClient();

	/*功能: 连接服务器
	输入参数host: 服务器ip
	输入参数port: 服务器端口
	返回参数  是否连接成功
	*/
	bool connectToHost(QString host, int port);
	void connectToHostAsync(QString host, int port);
	
	/*功能:从服务器断开连接
	*/
	void disconnectFromHost();
	
	/*功能:是否连接
	  返回参数  是否连接
	*/
    bool isConnect();
	
	/*功能:得到原始数据指针
	  返回参数  原始数据指针
	*/
	QTcpSocket *clientSocket();

	/*功能:发送数据包到服务器
	输入参数pack: 数据包
	返回参数  是否发送成功
	*/
	bool sendPack(const NetPack &pack);
	
	/*功能:等待服务器数据包
	  返回参数 数据包
	*/
	NetPackPtr waitPackAny();	
	
	/*功能:等待服务器数据包,依据类型
	  输入参数 type: 类型
	  返回参数 数据包
	*/
	NetPackPtr waitPackByType(int type);
	
	/*功能:等待服务器数据包，已经序号
	  输入参数 seq: 序号
	  返回参数 数据包
	*/
	NetPackPtr waitPackBySeq(int seq);

signals:
	/*功能: 连接信号
	*/
	void sigConnect();

	/*功能: 断开连接信号	  
	*/		
	void sigDisConnect();
	void sigError();
	
	/*功能: 新的数据包信号
	  输入参数: 数据包指针
	*/
	void newDataRecv(NetPackPtr pack);    

private slots:	
	void onReadyRead();
	void onDisConnected();
	void onConnected();

private:		
	NetPackPtr waitPack(int type,int param);

	QTcpSocket *tcpSocket;
	int mUser;
	int mWaitTime;
    bool mWaitData;

	NetDataManager m_dataManager;
};
